import assert from 'assert';
import _ from 'lodash';

/**
 * 自定义异常类
 */
export default class Exception extends Error {
    /** 错误码 */
    errcode;
    /** 错误消息 */
    errmsg;
    /** 数据 */
    data;
    /** HTTP状态码 */
    httpStatusCode;

    /**
     * 构造异常
     *
     * @param {Array} exception - 异常数组，包含错误码和错误消息
     * @param {string} [_errmsg] - 可选的异常消息
     */
    constructor(exception, _errmsg) {
        assert(_.isArray(exception), 'Exception must be Array');
        const [errcode, errmsg] = exception;
        assert(_.isFinite(errcode), 'Exception errcode invalid');
        assert(_.isString(errmsg), 'Exception errmsg invalid');
        super(_errmsg || errmsg);
        this.errcode = errcode;
        this.errmsg = _errmsg || errmsg;
    }

    /**
     * 比较异常的错误码
     *
     * @param {Array} exception - 异常数组，包含错误码和错误消息
     * @returns {boolean} 是否相等
     */
    compare(exception) {
        const [errcode] = exception;
        return this.errcode === errcode;
    }

    /**
     * 设置HTTP状态码
     *
     * @param {number} value - HTTP状态码
     * @returns {this} 当前实例
     */
    setHTTPStatusCode(value) {
        this.httpStatusCode = value;
        return this;
    }

    /**
     * 设置数据
     *
     * @param {*} value - 数据
     * @returns {this} 当前实例
     */
    setData(value) {
        this.data = _.defaultTo(value, null);
        return this;
    }
}